<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>回调形式的refs基本</title>
  </head>
  <body>
    <div id="test"></div>
    <!-- 引入react核心库  优先 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 引入react-dom用于支持react操作DOM，依赖react核心库 -->
    <script
      type="text/javascript"
      src="../js/react-dom.development.js"
    ></script>
    <!-- 引入babel，用于将jsx转换为js -->
    <script type="text/javascript" src="../js//babel.min.js"></script>
    <script type="text/babel">
      class Demo extends React.Component {
        // 如果 ref 回调函数是以内联函数的方式定义的，在重新过程中它会被执行两次，
        // 第一次传入参数 null，然后第二次会传入参数 DOM 元素。
        // 这是因为在每次渲染时会创建一个新的函数实例，所以 React 清空旧的 ref 并且设置新的。

        // ！！！！！通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题，
        // 但是大多数情况下它是无关紧要的。初始化状态
        state = { isHot: true };
        handler = () => {
          const { inputLeft, inputRight } = this;
          alert(inputLeft.value);
        };
        handlerRight = () => {
          const { inputRight } = this;
          alert(inputRight.value);
        };
        //切换天气的方法
        changeWeather = () => {
          const { isHot } = this.state;
          this.setState({ isHot: !isHot });
        };
        //通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免
        inputSave = (currentNode) => {
          this.inputLeft = currentNode;
          console.log("@", currentNode);
        };
        render() {
          const { isHot } = this.state;
          return (
            <div>
              <h2>今天天气很{isHot ? "炎热" : "凉爽"}</h2>
              {/*<input
                ref={(currentNode) => {
                  this.inputLeft = currentNode;
                  console.log("更新了吗", currentNode);
                }}
                type="text"
                placeholder="左侧输入"
              /> 这是内联函数的方式  其他地方更新页面也会触发函数
               如打印 console.log("更新了吗", currentNode);*/}
              <input ref={this.inputSave} type="text" placeholder="左侧输入" />
              &nbsp;&nbsp;
              <button onClick={this.handler}>左侧输入</button>&nbsp;&nbsp;
              <input
                ref={(currentNode) => {
                  this.inputRight = currentNode;
                }}
                onBlur={this.handlerRight}
                type="text"
                placeholder="右侧输入"
              />
              <button onClick={this.changeWeather}>切换天气</button>&nbsp;&nbsp;
            </div>
          );
        }
      }

      ReactDOM.render(<Demo />, document.getElementById("test"));
    </script>
  </body>
</html>
